{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "os.sys.path.append(os.path.dirname(os.path.abspath('.')))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from model_selection.train_test_split import train_test_split\n",
    "from preprocessing.StandardScaler import StandardScaler\n",
    "from datasets.dataset import load_wine\n",
    "\n",
    "data = load_wine()\n",
    "X, Y = data.data, data.target\n",
    "\n",
    "X = StandardScaler().fit_transform(X)\n",
    "\n",
    "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)\n",
    "\n",
    "# print(X_train.shape,Y_train.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型基础\n",
    "首先计算各个类别的均值向量与整体数据的均值向量。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "n_samples, n_features = X_train.shape\n",
    "\n",
    "mu = np.mean(X_train, axis=0)    # 数据均值，向量\n",
    "\n",
    "mu_k = list()    # 类均值向量，(K,n_feature)\n",
    "for k in np.unique(Y_train):\n",
    "    mu_k.append(np.mean(X_train[Y_train == k], axis=0))\n",
    "mu_k = np.array(mu_k)\n",
    "\n",
    "# print(mu.shape,mu_k.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "类内散度矩阵与类间散度矩阵："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "n_k = list()    # 类别计数\n",
    "\n",
    "S_w = np.zeros((n_features, n_features))    # 类内散度矩阵\n",
    "for k in np.unique(Y_train):\n",
    "    n_k.append(len(X_train[Y_train == k]))\n",
    "    tmp = X_train[Y_train == k]-mu_k[k]\n",
    "    S_w += np.dot(tmp.T, tmp)\n",
    "\n",
    "S_b = np.dot(n_k*(mu_k-mu).T, (mu_k-mu))    # 类间散度矩阵"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来的任务就是要找到映射方向，使得类间散度最大而类内散度最小。类似于PCA的原理，可以通过对$S_{w}^{-1}S_{b}$做特征值分解，最大特征值对应的特征向量即满足要求的映射方向。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "eigval, eigvec = np.linalg.eig(np.dot(np.linalg.inv(S_w),\n",
    "                                      S_b))    # 注意特征值与特征向量可能出现复数情况\n",
    "top_idx = np.argsort(eigval)[::-1]    # 特征值的排序索引\n",
    "top_vec = eigvec[:, top_idx[:2]]    # 取前两个特征向量\n",
    "\n",
    "X_trans = np.dot(X_train, top_vec.real)    # 只取特征向量的实部做运算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.scatter(X_trans[:, 0], X_trans[:, 1], c=Y_train)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 对比sklearn中的LDA降维变换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis\n",
    "\n",
    "lda = LinearDiscriminantAnalysis(n_components=2)\n",
    "X_trans = lda.fit_transform(X_train, Y_train)\n",
    "\n",
    "plt.scatter(X_trans[:, 0], X_trans[:, 1], c=Y_train)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "hide_input": false,
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
